home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / trashman / trashman.e < prev    next >
Text File  |  1994-12-14  |  5KB  |  218 lines

  1. /*
  2.  
  3. Trashman -- a Mac-alike trashcan icon updater
  4.  
  5. COPYRIGHT 1994 by C.Randall, of mbissaymssiK Software, Broken Spork technologies division.
  6.  
  7. Contact me through Internet:  crandall@garnet.msen.com
  8.  
  9. */
  10.  
  11.  
  12.  
  13. MODULE 'dos/dos','dos/dosextens','dos/notify','dos/dosextens','dos/dosasl'
  14. MODULE 'workbench/startup','wb','icon','workbench/workbench'
  15. MODULE 'utility/tagitem','utility'
  16. MODULE 'exec/nodes','exec/ports','exec/types','exec/memory'
  17. MODULE 'newicon','libraries/newicon'
  18. MODULE 'intuition/intuition'
  19.  
  20. ENUM STAT_UNKNOWN,STAT_FULL,STAT_EMPTY
  21.  
  22. DEF trash1[500]:STRING
  23. DEF trash2[500]:STRING
  24. DEF dir[500]:STRING
  25. DEF ffile[500]:STRING
  26. DEF diskobj1:PTR TO diskobject
  27. DEF diskobj2:PTR TO diskobject
  28. DEF notify:PTR TO notifyrequest
  29. DEF nmsg:PTR TO notifymessage
  30. DEF port:PTR TO mp
  31. DEF wb:PTR TO wbstartup
  32. DEF args:PTR TO wbarg
  33. DEF status=STAT_UNKNOWN
  34. DEF lock
  35.  
  36. DEF olddir,s,abort
  37.  
  38. PROC main()
  39.     NEW notify
  40.  
  41.     IF KickVersion(37)
  42.     IF (wbmessage)
  43.         SetTaskPri(FindTask(0),2)
  44.         IF (workbenchbase:=OpenLibrary('workbench.library',36))
  45.             IF (iconbase:=OpenLibrary('icon.library',36))
  46.                 IF (utilitybase:=OpenLibrary('utility.library',37))
  47.                     newiconbase:=OpenLibrary('newicon.library',37)
  48.                     
  49.                     wb:=wbmessage;args:=wb.arglist;olddir:=CurrentDir(args.lock)
  50.                     IF args.name>0
  51.                         GetCurrentDirName(ffile,490)
  52.                         AddPart(ffile,args.name,490)
  53.                         diskobj1:=GetDiskObjectNew(ffile)
  54.                     ENDIF
  55.                     CurrentDir(olddir)
  56.                     StrCopy(dir,'sys:trashcan',ALL)
  57.                     StrCopy(trash1,'env:sys/def_trashcan',ALL)
  58.                     StrCopy(trash2,'env:sys/def_fulltrashcan',ALL)
  59.                     IF diskobj1
  60.                         IF (s:=FindToolType(diskobj1.tooltypes,'WATCHDIR'))
  61.                             StrCopy(dir,s,ALL)
  62.                         ENDIF
  63.                         IF (s:=FindToolType(diskobj1.tooltypes,'TRASHCAN_EMPTY'))
  64.                             StrCopy(trash1,s,ALL)
  65.                         ENDIF
  66.                         IF (s:=FindToolType(diskobj1.tooltypes,'TRASHCAN_FULL'))
  67.                             StrCopy(trash2,s,ALL)
  68.                         ENDIF
  69.                         FreeDiskObject(diskobj1)
  70.                         diskobj1:=0
  71.                     ENDIF
  72.  
  73.                     IF (lock:=Lock(dir,ACCESS_READ))
  74.                         IF (port:=CreateMsgPort())
  75.                             notify.name:=dir
  76.                             notify.flags:=NRF_SEND_MESSAGE
  77.                             notify.port:=port
  78.                             abort:=FALSE
  79.                             IF (StartNotify(notify))
  80.                                 WHILE (abort=FALSE)
  81.                                     changestate()
  82.                                     Wait(SIGBREAKF_CTRL_C OR Shl(1,port.sigbit))
  83.                                     s:=FALSE
  84.                                     WHILE (nmsg:=GetMsg(port))
  85.                                         ReplyMsg(nmsg)
  86.                                         s:=TRUE
  87.                                     ENDWHILE
  88.                                     IF (s=FALSE) THEN abort:=TRUE
  89.                                 ENDWHILE
  90.                                 EndNotify(notify)
  91.                             ENDIF
  92.                             DeleteMsgPort(port)
  93.                         ENDIF
  94.                         UnLock(lock)
  95.                     ENDIF
  96.  
  97.                     IF (newiconbase) THEN CloseLibrary(newiconbase)
  98.                     CloseLibrary(utilitybase)
  99.                 ENDIF
  100.                 CloseLibrary(iconbase)
  101.             ENDIF
  102.             CloseLibrary(workbenchbase)
  103.         ENDIF
  104.     ENDIF
  105.     ENDIF
  106.  
  107.     END notify
  108. ENDPROC
  109.  
  110. PROC changestate()
  111.     DEF fh,fileinfo=0:PTR TO fileinfoblock
  112.     DEF apath=NIL:PTR TO anchorpath
  113.     DEF    achain=NIL:PTR TO achain
  114.     DEF dir2[500]:STRING
  115.     DEF flag=FALSE
  116.     DEF err,mode
  117.     NEW apath
  118.  
  119.     StrCopy(dir2,dir,ALL)
  120.     AddPart(dir2,'#?',490)
  121.  
  122.     IF (fh:=Lock(dir,ACCESS_READ))
  123.         err:=0;mode:=0
  124.         WHILE (err<2)
  125.             IF (mode=0)
  126.                 err:=MatchFirst(dir2,apath);mode:=1
  127.             ELSE
  128.                 err:=MatchNext(apath)
  129.             ENDIF
  130.             IF (err=0)
  131.                 achain:=apath.last
  132.                 IF (achain)
  133.                     fileinfo:=achain.info
  134.                     IF (fileinfo)
  135.                         IF (fileinfo.direntrytype<>0)
  136.                             StrCopy(ffile,dir,ALL)
  137.                             AddPart(ffile,fileinfo.filename,490)
  138.                             flag:=TRUE
  139.                         ENDIF
  140.                     ENDIF
  141.                 ENDIF
  142.             ENDIF
  143.         ENDWHILE
  144.         MatchEnd(apath)
  145.         IF (flag=FALSE)
  146.             EndNotify(notify)
  147.             notify.name:=dir
  148.             StartNotify(notify)
  149.             IF (status<>STAT_EMPTY) THEN copyimage(trash1,dir)
  150.             status:=STAT_EMPTY
  151.         ELSE
  152.             EndNotify(notify)
  153.             notify.name:=ffile
  154.             StartNotify(notify)
  155.             IF (status<>STAT_FULL) THEN copyimage(trash2,dir)
  156.             status:=STAT_FULL
  157.         ENDIF
  158.         UnLock(fh)
  159.     ENDIF
  160.  
  161.     END apath
  162. ENDPROC
  163.  
  164. PROC copyimage(source,dest)
  165.     DEF ndo1:PTR TO newdiskobject
  166.     DEF ndo2:PTR TO newdiskobject
  167.  
  168.     DEF newi1,newi2,newdi1,newdi2
  169.  
  170.     IF (newiconbase)
  171.         IF (ndo1:=GetNewDiskObject(source))
  172.             IF (ndo2:=GetNewDiskObject(dest))
  173.                 newi1:=ndo2.ndo_normalimage
  174.                 newi2:=ndo2.ndo_selectedimage
  175.                 diskobj1:=ndo2.ndo_stdobject
  176.                 diskobj2:=ndo1.ndo_stdobject    ->backwards!
  177.                 newdi1:=diskobj1.gadget::gadget.gadgetrender
  178.                 newdi2:=diskobj1.gadget::gadget.selectrender
  179.  
  180.                 diskobj1.gadget::gadget.gadgetrender:=diskobj2.gadget::gadget.gadgetrender
  181.                 diskobj1.gadget::gadget.selectrender:=diskobj2.gadget::gadget.selectrender
  182.                 ndo2.ndo_normalimage:=ndo1.ndo_normalimage
  183.                 ndo2.ndo_selectedimage:=ndo1.ndo_selectedimage
  184.  
  185.                 PutNewDiskObject(dest,ndo2)
  186.                 
  187.                 diskobj1.gadget::gadget.gadgetrender:=newdi1
  188.                 diskobj1.gadget::gadget.selectrender:=newdi2
  189.                 ndo2.ndo_normalimage:=newi1
  190.                 ndo2.ndo_selectedimage:=newi2
  191.                 FreeNewDiskObject(ndo2)
  192.             ENDIF
  193.             FreeNewDiskObject(ndo1)
  194.         ENDIF
  195.     ELSE
  196.         IF (diskobj1:=GetDiskObject(source))
  197.             IF (diskobj2:=GetDiskObject(dest))
  198.                 newdi1:=diskobj2.gadget::gadget.gadgetrender
  199.                 newdi2:=diskobj2.gadget::gadget.selectrender
  200.  
  201.                 diskobj2.gadget::gadget.gadgetrender:=diskobj1.gadget::gadget.gadgetrender
  202.                 diskobj2.gadget::gadget.selectrender:=diskobj1.gadget::gadget.selectrender
  203.  
  204.                 PutDiskObject(dest,diskobj2)
  205.                 
  206.                 diskobj2.gadget::gadget.gadgetrender:=newdi1
  207.                 diskobj2.gadget::gadget.selectrender:=newdi2
  208.                 FreeDiskObject(diskobj2)
  209.             ENDIF
  210.             FreeDiskObject(diskobj1)
  211.         ENDIF
  212.     ENDIF
  213.  
  214. ENDPROC
  215. versionstring:
  216. CHAR '\0$VER: trashman 1 (14.12.94) \t FREELY REDISTRIBUTABLE, COPYRIGHTED MATERIAL -- NOT FOR RESALE\0\0'
  217.  
  218.